Android OpenGL的简单使用(1):GlSurface的搭建

Posted by alonealice on 2020-12-24

OpenGL ES 的主要使用流程,可以概括如下:

在 Android 中,使用 OpenGL 最简单的办法便是使用官方提供的 GLSurfaceView 组件。其功能主要有:

  1. 管理一个 surface,这个 surface 就是一块特殊的内存,能直接排版到 android 的视图 view 上。
  2. 管理一个 EGL display,它能让 opengl 把内容渲染到上述的 surface 上。
  3. 用户可以自定义渲染器(render)。
  4. 让渲染器在独立的线程里运作,和 UI 线程分离。传统的 View 及其实现类,渲染等工作都是在主线程上完成的。
  5. 支持按需渲染(on-demand)和连续渲染(continuous)。

创建GLSurfaceView和render,并绑定

1
2
3
4
5
6
7
8
9
10
11
//新建GLSurfaceView实例
glSurfaceView = new GLSurfaceView(this);

// 创建渲染器实例
MyRenderer mRenderer = new MyRenderer();

// 设置渲染器
glSurfaceView.setRenderer(mRenderer);

//显示SurfaceView
setContentView(glSurfaceView);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class MyRenderer implements GLSurfaceView.Renderer {

// Surface创建的时候调用
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// 设置清屏颜色
gl.glClearColor(0f, 1f, 0f, 0f);
// 设置RENDERMODE_WHEN_DIRTY可以减少性能消耗
glSurfaceView.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
}

// Surface改变的的时候调用
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
// 设置窗口大小
gl.glViewport(width / 4, width / 2, width / 2, height / 2);
}

// 在Surface上绘制的时候调用
@Override
public void onDrawFrame(GL10 gl) {
// 清除屏幕
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
}
}

里面主要有3个方法:

onSurfaceCreated:它是在Surface创建的时候调用,可以在这里进行一些初始化操作,它携带两个参数GL10 和 EGLConfig。

1.通过setRenderMode设置渲染模式,有两种供选择

1
2
- GLSurfaceView.RENDERMODE_CONTINUOUSLY 不间断的绘制,默认渲染模式是这种
- GLSurfaceView.RENDERMODE_WHEN_DIRTY 在屏幕变脏时绘制,也就是当调用GLSurfaceView的requestRender ()方法后才会执行一次(第一次运行的时候会自动绘制一次)

2.调用gl.glClearColor(0f, 1f, 0f, 0f)设置清屏颜色为绿色,所谓清屏颜色就是当开始绘制时,屏幕所显示的颜色。glClearColor(float red, float green, float blue, float alpha)四个参数对应红、绿、蓝、透明度。这里的取值范围是0到1f。

1
2
- GL10         继承自GL的一个接口,封装了程序语言为OpenGL绑定的核心功能,我们可以把它理解为一个“画笔”,操作它提供的的方法来在GLSurfaceView上这块“画布”绘制
- EGLConfig 是一个抽象类,但是没有任何实现,不管它

onSurfaceChanged

它是在Surface大小改变的时候调用,这个方法只会执行一次,Surface创建时初始大小为0,所以需要指定窗口大小,调用glViewport(int x, int y, int width, int height)方法传入四个参数,x,y坐标和宽高。

这里要注意一点,这个窗口坐标原点是位于屏幕左下角,与android中的屏幕坐标系不一样。

glViewport的理解:可以这样理解这个方法。前两个参数是原点,单位是像素,(0,0)的话就在屏幕的左下角。后两个是截取的大小。当截取出这样一个绘制区域之后,绘制时,绘制的坐标轴会在绘制区域的中心,且中心与左边的距离为-1,与右边的距离为1。比如截取一块整个屏幕大小的绘制区域,且在其(0,0)点绘制一个点,那个就刚好在屏幕中点绘制了一个点。

onDrawFrame:它是在Surface上绘制的时候调用。

调用glClear(GL10.GL_COLOR_BUFFER_BIT)方法清除屏幕颜色,执行这个方法之后,屏幕就会渲染之前通过glClearColor设置的清屏颜色.如下图所示

如果设置渲染模式为GLSurfaceView.RENDERMODE_CONTINUOUSLY那么onDrawFrame方法会一直执行。